﻿/****************************************************************************************
 * Copyright © 2020 - 2023 by AngryKeyboard.
 * SFML_俄罗斯方块 is licensed under MulanOWL BY v1.
 * You can use this software according to the terms and conditions of the MulanOWL BY v1.
 * You may obtain a copy of MulanOWL BY v1 at:
 *          http://license.coscl.org.cn/MulanOWLBYv1
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 * See the MulanOWL BY v1 for more details.
****************************************************************************************/

/*******************************
操作说明：
1：切换到easy难度
2：切换到normal难度
3：切换到challenge难度
A：自动填充
P：暂停
R：游戏重启
↑：旋转
←↓→：方块移动
空格：方块直接落到底部
*******************************/


#pragma once
#include <vector>
#include <SFML/Graphics.hpp>
#include <SFML/Audio.hpp>
#include <time.h>
#include <RdpEncomAPI.h>
#include "CAutoFill.h"
#include "CBlock.h"
#include "const.h"

using namespace sf;
using std::vector;

class CGameWindow {
public:
  CGameWindow();  //初始化游戏数据
  ~CGameWindow();

  void start(); //开始游戏界面

protected:
  void checkGameOver(vector<CBlock>::iterator block);   //检查block是否造成游戏结束
  void clearLines();      //消除行
  void display();       //界面刷新
  void drawBlocks();      //绘制方块
  void getBestBlock();    //获取最佳方案（方块容器每次有变动时都应该调用一次，保证自动控制正确）
  void keyEvent_run();    //按键检查（游戏进行中的按键检查）
  void keyEvent_start();    //按键检查（游戏还未开始）
  void initText();      //初始化分数
  void newBlcok();    //使用测试集创建方块
  void renewBlocks();     //刷新方块容器
  void renewCurBlock();   //刷新当前方块状态
  void renewIcon();     //刷新图标
  void renewTable(vector<CBlock>::iterator block);      //把block固化到Table
  void renewText();     //刷新文本
  void renewScore(int lines); //根据消除行数加分
  void rePlay();        //重开一局
  void run();       //游戏运行

  void autoPressKey();  //模拟键盘发送消息

private:
  RenderWindow *m_pWindow;  //游戏窗口
  int m_arrnTable[ROW_COUNT][COL_COUNT];  //游戏区域

  vector<CBlock> m_vBlocks; //方块容器
  CBlock *m_pBestBlock;   //AI运算出的最佳方块
  float m_fDelay;   //方块自动下降的间隔时间
  int m_nBlockCounter;    //已生成的方块数量（用于计数）
  Text m_Text_BlockCounter; //已生成的方块数量（用于显示）
  int m_nScore;   //分数（用于计数）
  Text m_TextScore; //分数（用于显示）
  int m_nLines;   //已消除行数（用于计数）
  Text m_TextLines; //已消除行数（用于显示）
  Font m_Font;    //字体

  Texture m_TextureBlock, m_TextureBg, m_TextureFrame;    //图片文件
  Sprite m_SpriteBlock, m_SpriteBg, m_SpriteFrame;//绘图用的对象
  Music m_MusicBg;          //背景乐
  SoundBuffer m_Buffer_ClearLine;   //消除一行时的音效文件
  Sound m_Sound_ClearLine;      //播放音效用的对象

  bool m_bStart;    //游戏是否已经开始
  Text m_TextGameInfo;  //游戏介绍（游戏开始界面显示）
  bool m_bPause;    //游戏暂停标记
  Text m_TextPause;
  bool m_bGameOver; //游戏结束标记
  Text m_TextGameOver;
  bool m_bAutoFill; //自动填充标记
  Text m_TextAuto;  //自动填充标记（用于显示）

  int m_nHardLevel;   //当前难度等级
  Text m_TextHardLevel; //当前难度等级（用于显示）
  Clock m_Clock_BornTimer;//用来控制方块生成
  Text m_TextBornTimer;//显示时间
};
